package com.ag.oa.core.dao;

import com.ag.oa.core.entity.dto.UserScoreDTO;
import com.ag.oa.core.entity.vo.SkillVO;
import com.ag.oa.core.entity.vo.UserVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository("userDao")
public interface IUserDao {

    UserVO getById(@Param("id") Object id);

    void saveNewWxRegisterUser(UserVO user);

    void updateAuthUser(UserVO user);

    /**
     * 修改昵称或手机号
     * @param user
     */
    void updateUsernameOrPhone(UserVO user);

    /**
     * 获取默认会员列表用户信息
     *
     * 1. 排除teamTalk系统默认用户
     * 2. 合格的用户（昵称、手机号符合规范的）
     * @param id
     * @param username
     * @param offset
     * @param pageSize
     * @return
     */
    List<UserVO> getUserPageList(@Param("id") Integer id, @Param("username") String username
            , @Param("offset") Integer offset, @Param("pageSize") Integer pageSize);

    int getCountByUsername(@Param("username") String username);

    int getCountByPhone(@Param("phone") String phone);

    void updateUserByColumnType(@Param("id") Integer id, @Param("valueStr") String valueStr
            , @Param("type") Integer type);

    void updateUserRegion(@Param("id") Integer id, @Param("country") String country
            , @Param("province") String province, @Param("city") String city);

    /**
     * 查询获取用户信息
     *
     * 添加推荐人
     *
     * 1. 排除teamTalk系统默认用户
     * 2. 合格的用户（昵称、手机号符合规范的）
     * @param id
     * @param username
     * @return
     */
    List<UserVO> getUsersDataByUsername(@Param("id") Integer id, @Param("username") String username);

    void updateMyRefereeUser(@Param("id") Integer id, @Param("refereeUserId") Integer refereeUserId);

    String getUsernameById(@Param("id") Integer id);

    // 获取所有决策用户 id
    List<Integer> getAllDecisionUserPrimaryKeys();

    void updateVipById(@Param("id") Integer id, @Param("vipGrade") Integer vipGrade);

    // 获取所有的工作技能
    List<SkillVO> getWorkSkillListById(@Param("userId") Object userId);

    // 保存用户积分得分记录
    void saveNewScoreRecord(@Param("projectId") Integer projectId, @Param("userId") Integer userId
            , @Param("createdBy") Integer createdBy, @Param("score") Integer score
            , @Param("description") String description, @Param("type") Integer type, @Param("created") String created);

    List<Map<String, Object>> getScoreRecordList(@Param("userId") Integer userId, @Param("offset") Integer offset
            , @Param("pageSize") Integer pageSize);

    /**
     * 支出，用户积分（乐观锁）
     * @param userId
     * @param transactionScore
     * @param updated 字段类型变动，10位时间戳
     * @param userNowScore 用户当前积分
     * @return
     */
    Integer updateUserOutScore(@Param("userId") Integer userId,
                               @Param("transactionScore") Integer transactionScore,
                               @Param("updated") Long updated,
                               @Param("userNowScore") Integer userNowScore);

    /**
     * 收入，用户积分（乐观锁）
     * @param userId
     * @param transactionScore
     * @param updated 字段类型变动，10位时间戳
     * @param userNowScore 用户当前积分
     * @return
     */
    Integer updateUserInScore(@Param("userId") Integer userId,
                              @Param("transactionScore") Integer transactionScore,
                              @Param("updated") Long updated,
                              @Param("userNowScore") Integer userNowScore);

    /**
     * 增加，用户积分收支明细记录
     * @param userScoreDTO
     */
    void insertUserScore(UserScoreDTO userScoreDTO);

    void updateOpenIdByPhone(@Param("openId") String openId, @Param("phone") String phone);


    /**
     * 修改个人信息，公开状态
     * @param userId
     * @param publicStatus
     */
    void updatePublicStatusByUserId(@Param("userId") Integer userId, @Param("publicStatus") Integer publicStatus);

}
